package com.nebula.poi.controller;

import com.nebula.poi.pojo.User;
import com.nebula.poi.server.UserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: llq
 * @Date: 2019/9/20
 */
@Slf4j
@Controller
public class IndexController {
    @Autowired
    private UserService userService;


    /**
     * 查出用户名和密码并显示到index页面
     * @param model
     * @return
     */
    @RequestMapping("/index")
    public String showUser(Model model) {
        List<User> users = userService.selectUsers();
        model.addAttribute("user", users);
        return "index";
    }


    /**
     * 导出Excel文件
     * 该代码表示将details.xls的Excel文件通过应答实体（response）输出给请求的客户端浏览器，客户端可保存或直接打开
     * 实际开发中应封装到业务层组件中，然后在控制层中调用
     * @param response
     * @throws IOException
     */
    @RequestMapping(value = "/export")
    @ResponseBody
    public void export(HttpServletResponse response) throws IOException {
        List<User> users = userService.selectUsers();

        //创建Excel文档对象  （一个Excel文件相当于一个Workbook）
        HSSFWorkbook wb = new HSSFWorkbook();

        //创建HSSFSheet（Excel表单）对象，及表名sheetname  （一个Excel文件里可以有多个sheet）
        HSSFSheet sheet = wb.createSheet("获取excel测试表格");

        HSSFRow row = null;

        //创建第一行  (一个sheet里可以有多个row）
        row = sheet.createRow(0);
        //设置行高
        row.setHeight((short) (26.25 * 20));

        //createCell创建单元格 , setCellValue为第一行单元格设值  (一个row里可以有多个cell）
        row.createCell(0).setCellValue("用户信息列表");

        /* 合并单元格addMergedRegion
         * 合并的区域CellRangeAddress
         * 起始行，截至行，起始列， 截至列
         * firstRow从第1行开始
         * lastRow从第1行结束
         *
         *从第1个单元格开始
         * 从第3个单元格结束
         */
        CellRangeAddress rowRegion = new CellRangeAddress(0, 0, 0, 2);
        sheet.addMergedRegion(rowRegion);

      /*CellRangeAddress columnRegion = new CellRangeAddress(1,4,0,0);
      sheet.addMergedRegion(columnRegion);*/

        /*
         * 动态获取数据库列 sql语句 select COLUMN_NAME from INFORMATION_SCHEMA.Columns where table_name='user' and table_schema='test'
         * 第一个table_name 表名字
         * 第二个table_name 数据库名称
         * */
        //在sheet表单里创建第二行
        row = sheet.createRow(1);
        //设置行高
        row.setHeight((short) (22.50 * 20));
        //为第一个单元格设值
        row.createCell(0).setCellValue("用户Id");
        //为第二个单元格设值
        row.createCell(1).setCellValue("用户名");
        //为第三个单元格设值
        row.createCell(2).setCellValue("用户密码");

        //将数据库的user数据存入sheet表单的第3行往后
        for (int i = 0; i < users.size(); i++) {
            row = sheet.createRow(i + 2);
            User user = users.get(i);
            row.createCell(0).setCellValue(user.getUid());
            row.createCell(1).setCellValue(user.getUsername());
            row.createCell(2).setCellValue(user.getPassword());
        }
        sheet.setDefaultRowHeight((short) (16.5 * 20));

        //列宽自适应
        for (int i = 0; i <= 13; i++) {
            sheet.autoSizeColumn(i);
        }

        //将返回的数据转为excel
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        OutputStream os = response.getOutputStream();
        //默认Excel名称
        response.setHeader("Content-disposition", "attachment;filename=user.xls");
        //将Excel写出
        wb.write(os);
        //刷新输出流
        os.flush();
        os.close();
    }

    /**
     * 简单导入Excel文件，存入list集合
     * @param xlsPath
     * @return
     * @throws IOException
     */
    @PostMapping(value = "/import")
    public List<User> loadScoreInfo(String xlsPath) throws IOException{
        List list = new ArrayList();
        FileInputStream fileIn = new FileInputStream(xlsPath);
        //根据指定的文件输入流导入Excel从而产生Workbook对象
        Workbook wb0 = new HSSFWorkbook(fileIn);
        //获取Excel文档中的第一个表单
        Sheet sht0 = wb0.getSheetAt(0);
        //对Sheet中的每一行进行迭代
        for (Row r : sht0) {
            //如果当前行的行号（从0开始）未达到2（第三行）则从新循环
            //从第3行开始
            if(r.getRowNum()<1){
                continue;
            }
            //创建实体类
            User user=new User();
            //取出当前行第1个单元格数据，并封装在info实体stuName属性上
            user.setUsername(r.getCell(0).getStringCellValue());
            user.setPassword(r.getCell(1).getStringCellValue());
            list.add(user);
        }
        fileIn.close();
        return list;
    }

    /**
     * 复杂导入Excel文件，存入数据库
     * MultipartFile  一般是接受前台传来的文件 ，这里接受的是Excel
     * @param file
     * @param session
     * @return
     */
    @RequestMapping(value = "/import")
    public String exImport(@RequestParam(value = "filename") MultipartFile file, HttpSession session) {
        //如果没有提供参数file
        //File file = new File("//localhost/Middle_Dir/bomtoerp/"+request.getParameter("filename"));
        // list = getAllExcel(file);//这里调用函数来获取每个目录下的Excel中数据

        boolean a = false;

        //返回上传时的原始文件名
        String fileName = file.getOriginalFilename();

        try {
            a = userService.batchImport(fileName, file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:index";
    }
}
